package com.itheima.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.itheima.bean.ShoppingCart;
import com.itheima.config.BaseContext;
import com.itheima.mapper.ShoppingCartMapper;
import com.itheima.service.ShoppingCartService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;
import java.util.List;

@Service
@Transactional
public class ShoppingCartServiceImpl implements ShoppingCartService {

    @Autowired
    private ShoppingCartMapper mapper;

    /**
     * 添加购物车
     *  1、页面提交过来的数据不能直接就放到数据表【shopping_cart】里面，
     *  2、还缺少一些数据：
     *      2.1 缺少user_id，
     *            直接使用BaseContext.get() 即可得到userId
     *      2.2 缺少create_time
     *            只需要设置 LocalDateTime.now()
     *      2.3 缺少number
     *          2.3.1 其实就是这个菜品|套餐在购物车里面的数量
     *          2.3.2 数量不能简单的直接认为是1，或者是2
     *          2.3.3 在添加购物车的时候，需要去查询数据库
     *              2.3.3.1 在查询之前，先判断现在添加进来的是菜品还是套餐
     *              2.3.3.2 如果是菜品，那么就使用user_id 和 dish_id 去查询购物车表，看看有没有这个菜品
     *                  a. 如果有，就修改这个number值 +1 即可 变为修改操作
     *                  b. 如果没有，就添加一条记录，变为添加操作
     *              2.3.3.3 如果是套餐，那么就使用user_id 和 setmeal_id 去查询购物车表，看看有没有这个套餐。
     *                  a. 如果有，就修改这个number值 +1 即可 变为修改操作
     *                  b. 如果没有，就添加一条记录，变为添加操作
     *
     * @param shoppingCart
     * @return
     */
    @Override
    public ShoppingCart add(ShoppingCart shoppingCart) {
        //1、补充缺少的user_id 和 create_time
        shoppingCart.setUserId(BaseContext.get());
        //这里不能使用通用字段填充的手段，因为通用字段的填充是要执行完一个整体，
        //其他的通用字段也要存在，才能一起赋值，否则报错
        shoppingCart.setCreateTime(LocalDateTime.now());

        //2、创建查询条件
        LambdaQueryWrapper<ShoppingCart> lqw = new LambdaQueryWrapper<>();
        lqw.eq(ShoppingCart::getUserId,BaseContext.get());


        //2、判断现在添加的是菜品还是套餐？
        Long dishId = shoppingCart.getDishId();
        if (dishId != null) {//现在添加到数据库的是一个菜品
            // select * from shopping_cart where user_id = ? and dish_id = ?
            lqw.eq(ShoppingCart::getDishId,dishId);
        } else {//先要添加到数据库的是套餐
            // select * from shopping_cart where user_id = ? and setmeal_id = ?
            lqw.eq(ShoppingCart::getSetmealId,shoppingCart.getSetmealId());
        }
        //2.2 执行查询操作
        ShoppingCart cartInDB = mapper.selectOne(lqw);
        //2.3 判定有没有这个菜品|套餐
        if (cartInDB == null) {//表明这个菜品|套餐在数据库里没有。要执行添加操作
            shoppingCart.setNumber(1);
            mapper.insert(shoppingCart);
            return shoppingCart;
        } else { //表明这个菜品|套餐在数据库 有记录，要执行更新操作
            cartInDB.setNumber(cartInDB.getNumber() + 1);
            cartInDB.setAmount(cartInDB.getAmount().add(shoppingCart.getAmount()));
            mapper.updateById(cartInDB);
            return cartInDB;
        }
    }

    /**
     * 按照用户的id来查询数据
     * @param userId
     * @return
     */
    @Override
    public List<ShoppingCart> findAll(Long userId) {
        LambdaQueryWrapper<ShoppingCart> lqw = new LambdaQueryWrapper<>();
        lqw.eq(ShoppingCart::getUserId,userId);
        return mapper.selectList(lqw);
    }

    /**
     * 按照用户的id来清空购物车
     * @param userId
     * @return
     */
    @Override
    public int delete(Long userId) {
        LambdaQueryWrapper<ShoppingCart> lqw = new LambdaQueryWrapper<>();
        lqw.eq(ShoppingCart::getUserId , userId);
        return mapper.delete(lqw);
    }
}
